import {Event} from "../Event"

export class DispatcherUtils{
    private constructor(){};
    private static _eventDispatcher = [];

    /**
     * 订阅某个事件的常驻监听,该监听不会自动删除,适用于长监听
     * @param event_name 事件名称
     * @param func 监听函数
     * @return handler
     */
    static addEventListener(event_name:Event,func) {
        var handler = this._eventDispatcher.length
        this._eventDispatcher[handler] = { e:event_name , f:func}
        return handler
    }


    /**
     * 安全的订阅某个事件的常驻监听,并且会做安全检查,防止相同的监听添加,该监听不会自动删除,适用于长监听
     * @param event_name 事件名称
     * @param func 监听函数
     * @return handler
     */
    static addEventListenerSafe(event_name:Event,func) {
        for(var i in this._eventDispatcher){
            var k = this._eventDispatcher[i];
            if(k.e == event_name && k.f == func){
                return k;
            }
        }
        return this.addEventListener(event_name,func)
    }

    /**
     * 订阅某个事件的自动监听,该种监听在收到一次后会自动将自己删除,适用于一次性监听
     * @param event_name 事件名称
     * @param func 监听函数
     * @return handler
     */
    static addAutoEventListener(event_name:Event,func) {
        var handler = this._eventDispatcher.length
        this._eventDispatcher[handler] = { e:event_name , f:func , a:true}
        return handler
    }

    /**
     * 触发某个事件
     * @param event_name 事件名称
     * @param 其余参数为了支持可变带参
     */
    static dispatchEvent(event_name:Event,a?,b?,c?,d?,e?,f?){
        var gc = [];
        for(var i in this._eventDispatcher){
            var k = this._eventDispatcher[i];
            if(k.e==event_name){
                k.f(a,b,c,d,e,f)
                if(k.a){
                    gc[gc.length] = i;
                }
            }
        }
        for(var i in gc){
            this.removeEventListener(gc[i])
        }
    }

    /**
     * 删除监听器
     * @param handler
     */
    static removeEventListener(handler){
        delete this._eventDispatcher[handler]
    }

    static removeEventListenerByEvent(event_name:Event){
        for(var i in this._eventDispatcher){
            var k = this._eventDispatcher[i];
            if(k.e==event_name){
                delete this._eventDispatcher[i];
            }
        }
    }
}